package com.gujiangbo.redemo;

import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.List;
import java.util.stream.IntStream;

/**
 * String 类型
 */
public class RedisStringDemo {

    public Jedis jedis = JedisFactory.getJedis();

    @Test
    public void testSetString() {
        /**
         * ex seconds : 为键设置秒级过期时间
         * px milliseconds : 为键设置毫秒级过期时间
         * nx : 键必须不存在，才可以设置成功，用于添加
         * xx : 与nx 相反，键必须存在，才可以设置成功，用于更新
         */
        //当键name不存在时，设置属性值，并添加过期时间20s
        jedis.set("name", "gujiangbo", "nx", "ex", 20);
        //当键age存在时候，才可以设置成功，并更新age的值，设置过期时间,如果键不存在，则更新不成功
        jedis.set("age", String.valueOf(30), "xx", "ex", 20);


        /**
         * @param key 键
         * @param seconds 过期时间
         * @param value 值
         */
        jedis.setex("school", 30, "QingHua University");

        /**
         * @param key 键
         * @param value 值
         * @return 0:键存在 ; 1:设置成功
         * 如果键已经存在，则设置失败，返回0 ，设置成功返回1
         */
        Long setnx = jedis.setnx("goods", "电子书");
        System.out.println(setnx);
    }

    @Test
    public void testBatchSetString() {
        /**
         * mset 批量设置 键值对
         */
        jedis.select(1);
        String mset = jedis.mset("name", "gujiangbo", "age", "30", "address", "JiangSu Province");
        System.out.println(mset);
        HashMap<String, String> map = new HashMap<>();
        IntStream.range(0, 100000).forEach(v -> jedis.set("confession:" + v, "I LOVE YOU"));

        /**
         * mget 批量获取 值
         */
        List<String> mget = jedis.mget("name", "age", "address");
        mget.stream().forEach(System.out::println);
    }

    /**
     * Incr 自增
     * Decr 自减
     */
    @Test
    public void testIncrDecrCount() {
        /**
         * Decr -1操作，并返回结果值
         * incr +1操作，并返回结果值
         * @result
         * 如果操作的值不是整数，返回错误
         * 值是整数，返回自增、自减后的结果
         * 键不存在，按照值为0自增、自减，返回结果1或者-1
         */
        Long incr = jedis.incr("age");
        System.out.println("age Incr result :" + incr);

        Long decr = jedis.decr("age");
        System.out.println("age Decr result :" + decr);
    }

    /**
     * 其他不常用的命令
     */
    @Test
    public void testOtherString() {
        /**
         * append 向已经存在的字符串尾部追加数据,如果键不存在，则创建键值对
         */
        jedis.append("address", "JiangSu LianYunGang GanYuQu DunShangZhen DiaoTuanCun");

        /**
         * strLen 字符串长度
         */
        Long address = jedis.strlen("address");
        System.out.println(jedis.get("address") + "长度:" + address);

        /**
         * getSet key value 设置并返回原值
         */
        String home = jedis.getSet("address", "shangHai");
        System.out.println(home);

        /**
         * setrange key offset value 设置指定位置的字符
         */
        jedis.setrange("address", 0, "S");
        System.out.println(jedis.get("address"));
        /**
         * getRange key start end 获取部分字符串,偏移量从0开始计算
         */
        String result = jedis.getrange("address", 0, 4);
        System.out.println(result);
    }

    /**
     * 内部编码
     * 字符串类型的内部编码有3种：
     * int: 8个字节的长整型
     * embstr: 小于等于44个字节的字符串
     * raw: 大于44个字节的字符串
     */
    @Test
    public void testInnerEncodingString() {
        jedis.select(4);
        jedis.set("objEncoding", "gujiangbo");
        String objEncoding = jedis.objectEncoding("objEncoding");
        System.out.println(objEncoding);

        jedis.set("address", "DiaoTuanCun DunShangZhen GanYuXian LianYunGangShi JiangSuSheng");
        String objectEncoding = jedis.objectEncoding("address");
        System.out.println(objectEncoding);

        jedis.set("age", "33");
        String objectEncoding1 = jedis.objectEncoding("age");
        System.out.println(objectEncoding1);


    }

    /**
     * del key   删除 key
     * result 1:删除成功   0：键不存在或删除失败
     */
    @Test
    public void testDelString() {
        Long del = jedis.del("address");
        System.out.println(del);
    }


}
